/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.controladores.ABMProveedor;


import estsapp.controladores.Controlador;
import estsapp.controladores.ControladorPrincipal;
import estsapp.controladores.FabricaControladores;
import estsapp.entidades.Proveedor;
import estsapp.expertos.ExpertoABMProveedor;
import estsapp.expertos.FabricaExpertos;
import estsapp.expertos.excepciones.ABMProveedorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.Conexion;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMProveedor implements Controlador {

    PantallaABMProveedor pantalla;
    PantallaProveedorJDialog pantallaProveedorJDialog = new PantallaProveedorJDialog(null, true);
    ExpertoABMProveedor experto;
    Proveedor proveedor;
    ModeloTablaProveedores modeloTablaProveedores = new ModeloTablaProveedores();
    boolean iniciado;

    public ControladorABMProveedor() {
        pantalla = new PantallaABMProveedor();
        experto = (ExpertoABMProveedor) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PROVEEDOR);
        
        pantallaProveedorJDialog.setLocationRelativeTo(null);

        pantalla.getTablaProveedores().setModel(modeloTablaProveedores);
        pantalla.getTablaProveedores().setAutoCreateRowSorter(true);
        pantalla.getTablaProveedores().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarProveedor();
            }
        });



        /**
         * ################################################################
         * ################################################################
         * Barra herramientas
         * ################################################################
         * ################################################################
         */
        agregarAccionesABotones();


    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.toFront();
            pantalla.setVisible(true);
        }

        ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).setListaElementos(experto.buscarProveedores());
    }

    public void guardar() {
        if (proveedor == null) {
            proveedor = new Proveedor();
        }
        proveedor.setNombre(pantallaProveedorJDialog.getTextoNombre().getText());
        proveedor.setDireccion(pantallaProveedorJDialog.getTextoDireccion().getText());
        proveedor.setEmail(pantallaProveedorJDialog.getTextoMail().getText());
        proveedor.setTelefono(pantallaProveedorJDialog.getTextoTelefono().getText());
        proveedor.setTiempoDemora(Float.valueOf(pantallaProveedorJDialog.getTextoDemora().getText()));

        try {
            experto.guardar(proveedor);
        } catch (ABMProveedorException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Proveedor Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        agregarProveedorATabla(proveedor);
        limpiarCampos();


    }

    public void modificar() {
        if (proveedor == null) {
            proveedor = new Proveedor();
        }
        proveedor.setNombre(pantallaProveedorJDialog.getTextoNombre().getText());
        proveedor.setDireccion(pantallaProveedorJDialog.getTextoDireccion().getText());
        proveedor.setEmail(pantallaProveedorJDialog.getTextoMail().getText());
        proveedor.setTelefono(pantallaProveedorJDialog.getTextoTelefono().getText());
        proveedor.setTiempoDemora(Float.valueOf(pantallaProveedorJDialog.getTextoDemora().getText()));


        try {
            experto.modificar(proveedor);
        } catch (ABMProveedorException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Proveedor Modificado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        agregarProveedorATabla(proveedor);

    }

    private void limpiarCampos() {
        proveedor = null;

//        pantalla.limpiarCampos();
    }

    private void seleccionarProveedor() {
        int fila = pantalla.getTablaProveedores().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaProveedores().convertRowIndexToModel(fila);
        proveedor = (Proveedor) ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).getRow(filaModelo);
        cargarDatosProveedorEnJDialog(proveedor);
    }

    private void cargarDatosProveedorEnJDialog(Proveedor proveedor) {
        pantallaProveedorJDialog.getTextoNombre().setText(proveedor.getNombre());
        pantallaProveedorJDialog.getTextoDireccion().setText(proveedor.getDireccion());
        pantallaProveedorJDialog.getTextoMail().setText(proveedor.getEmail());
        pantallaProveedorJDialog.getTextoTelefono().setText(proveedor.getTelefono());
        pantallaProveedorJDialog.getTextoDemora().setText(proveedor.getTiempoDemora().toString());

    }

    private void agregarProveedorATabla(Proveedor proveedor) {
        List trabajadores = ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).getListaElementos();
        for (Iterator it = trabajadores.iterator(); it.hasNext();) {
            Object trabajadorLista = it.next();
            if (proveedor.equals(trabajadorLista)) {
                ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).fireTableDataChanged();
                return;
            }
        }
        ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).addRow(proveedor);
    }

    private void quitarTrabajadorTabla(Proveedor proveedor) {
        List trabajadores = ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).getListaElementos();
        for (Iterator it = trabajadores.iterator(); it.hasNext();) {
            Object materialLista = it.next();
            if (proveedor.equals(materialLista)) {
                ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).getListaElementos().remove(proveedor);
                ((ModeloTablaProveedores) pantalla.getTablaProveedores().getModel()).fireTableDataChanged();
                return;
            }
        }
    }

    private void darBaja() {
        if (proveedor == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja al material: " + proveedor.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                Conexion.getInstancia().iniciarTX();
                experto.darDeBaja(proveedor);
                Conexion.getInstancia().confirmarTx();
            } catch (ExcepcionFachada ex) {
                Conexion.getInstancia().deshacerTx();
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "El Proveedor seleccionado fue dado de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            quitarTrabajadorTabla(proveedor);
            limpiarCampos();
        }
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void agregarAccionesABotones() {

        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoProveedor();
            }
        });
        pantalla.getBtnModificar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (proveedor != null) {
                    modificarProveedor();
                }
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnEliminar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (proveedor != null) {
                    darBaja();
                }

            }
        });
        pantallaProveedorJDialog.getBtnSalirJDialog().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaProveedorJDialog.setVisible(false);
            }
        });
        pantalla.getBtnSeleccionarPredeterminado().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarProvedorPredeterminado();
            }
        });

        pantallaProveedorJDialog.getBtnGuardar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (pantallaProveedorJDialog.getTextoDireccion().getText().length() > 0
                        && pantallaProveedorJDialog.getTextoMail().getText().length() > 0
                        && pantallaProveedorJDialog.getTextoNombre().getText().length() > 0
                        && pantallaProveedorJDialog.getTextoDemora().getText().length() > 0
                        && pantallaProveedorJDialog.getTextoTelefono().getText().length() > 0) {
                    if (proveedor == null) {
                        guardar();
                    } else {
                        modificar();
                    }
                    limpiarPantallaProveedorJDialog();
                    pantallaProveedorJDialog.setVisible(false);
                }
            }
        });


    }

    public void seleccionarProvedorPredeterminado() {
        if (proveedor != null) {
            try {
                Conexion.getInstancia().iniciarTX();
                experto.actualizarProvedorPredeterminado(proveedor);
                Conexion.getInstancia().confirmarTx();
            } catch (ExcepcionFachada ex) {
                Conexion.getInstancia().deshacerTx();
            }
        } else {
            JOptionPane.showMessageDialog(null, "Seleccione proveedor");
        }
        ((ModeloTablaProveedores)pantalla.getTablaProveedores().getModel()).setListaElementos(experto.buscarProveedores());
    }

    public void nuevoProveedor() {
        limpiarPantallaProveedorJDialog();
        pantallaProveedorJDialog.setVisible(true);

    }

    public void modificarProveedor() {
        pantallaProveedorJDialog.setVisible(true);

        pantallaProveedorJDialog.getTextoDireccion().setText(proveedor.getDireccion());
        pantallaProveedorJDialog.getTextoNombre().setText(proveedor.getNombre());
        pantallaProveedorJDialog.getTextoMail().setText(proveedor.getEmail());
        pantallaProveedorJDialog.getTextoTelefono().setText(proveedor.getTelefono());
        pantallaProveedorJDialog.getTextoDemora().setText(proveedor.getTiempoDemora().toString());
        

    }

    private void limpiarPantallaProveedorJDialog() {
        proveedor = null;
        pantallaProveedorJDialog.getTextoDireccion().setText("");
        pantallaProveedorJDialog.getTextoNombre().setText("");
        pantallaProveedorJDialog.getTextoMail().setText("");
        pantallaProveedorJDialog.getTextoTelefono().setText("");
        pantallaProveedorJDialog.getTextoDemora().setText("");
    }
}
